package com.kai.Util;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 用于导出Excel文件的工具类
 */
public class MyExportExcelUtils {
    /**
     * 导出表格的表名
     */
    private String title;
    /**
     * 导出表格的列名
     */
    private List<String> rowName;
    /**
     * 对象数组的List集合
     */
    private List dataList = new ArrayList<>();

    private HttpServletResponse response;


    /**
     * 传入要导入的数据
     */
    public MyExportExcelUtils(String title, List<String> rowName, List dataList, HttpServletResponse response) {
        this.title = title;
        this.rowName = rowName;
        this.dataList = dataList;
        this.response = response;
    }

    /**
     * 导出日计量数据
     */
    public void exportCompanyDanCountData() {
        try {
            // 创建一个excel对象
            SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(500);
            // 创建表格
            Sheet sheet = sxssfWorkbook.createSheet(title);

            // sheet样式定义
            // 头样式
            CellStyle columnTopStyle = this.getColumnTopStyle(sxssfWorkbook);
            // 单元格样式
            CellStyle style = this.getStyle(sxssfWorkbook);

            // 产生表格标题行
            // 行
            Row rowm = sheet.createRow(0);
            // 单元格
            Cell cellTiltle = rowm.createCell(0);


            /**
             * 参数说明
             * 从0开始   第一行 第一列 都是从角标0开始
             * 行 列 行列    (0,0,0,5)  合并第一行 第一列  到第一行 第六列
             * 起始行，起始列，结束行，结束列
             *
             * new Region()  这个方法使过时的
             */
            // 合并第一行的所有列
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, (short) (rowName.size() - 1)));
            //设置单元格样式
            cellTiltle.setCellStyle(columnTopStyle);
            //设置单元格的值
            cellTiltle.setCellValue(title);

            // 表格列的列数=列名数组的长度
            int columnNum = rowName.size();
            // 在第二行创建行
            Row rowRowName = sheet.createRow(1);
            CellStyle cells = sxssfWorkbook.createCellStyle();
            cells.setBottomBorderColor(HSSFColor.BLACK.index);
            rowRowName.setRowStyle(cells);

            // 循环 将列名放进去
            for (int i = 0; i < columnNum; i++) {

                Cell cellRowName = rowRowName.createCell((int) i);
                // 单元格类型
                cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);
                // 得到列的值
                String s = rowName.get(i);
                HSSFRichTextString text = new HSSFRichTextString(s);
                // 设置列的值
                cellRowName.setCellValue(text);
                // 样式
                cellRowName.setCellStyle(columnTopStyle);

                //  让列宽随着导出的列长自动适应
                sheet.setColumnWidth(i, s.getBytes().length * 2 * 256);
            }

            //创建合计行
            // 行
            Row rowm2 = sheet.createRow(2);
            //合并第二行的第一列到第二行的第三列
            sheet.addMergedRegion(new CellRangeAddress(2, 2, 0, 2));
            // 单元格
            Cell cellTiltle2 = rowm2.createCell(0);
            //设置单元格样式
            cellTiltle2.setCellStyle(columnTopStyle);
            //设置第二行单元格前三列的值为“合计”
            cellTiltle2.setCellValue("合计");

            // 将查询到的数据设置到对应的单元格中
            int listSize = dataList.size();
            //日期的最大列数
            int count = columnNum - 2;
            //合计的列数
            int count02 = columnNum - 1;

            //创建二维数组存储每一行每一列的报关单数
            int[][] rowCountArray = new int[listSize][count02 - 2];

            for (int i = 0; i < listSize; i++) {
             /*   //遍历每个对象
                CompanyDanCount companyDanCount = (CompanyDanCount) dataList.get(i);
                //创建所需的行数，+3是因为标题和表头以及合计已经占了3行
                Row row = sheet.createRow(i + 3);

                // 第一列设置为序号
                Cell cell = row.createCell(0, HSSFCell.CELL_TYPE_NUMERIC);
                cell.setCellValue(i + 1);

                //设置单元行每列的值
                Cell cell2 = row.createCell(1, HSSFCell.CELL_TYPE_NUMERIC);
                cell2.setCellValue(companyDanCount.getCompanyId());
                Cell cell3 = row.createCell(2, HSSFCell.CELL_TYPE_STRING);
                cell3.setCellValue(companyDanCount.getCompanyName());

                //遍历日期集合数据填充数据
                Map<String, Integer> countMap = companyDanCount.getCountMap();
                //创建单元格，列从第三列开始的，因为前面已经有序号，公司ID，公司名字
                for (int x = 3; x <= count; x++) {
                    //获取列名
                    String key = rowName.get(x);
                    //获取集合中对应的对象
                    Integer dayCount = countMap.get(key);
                    Cell cell4 = row.createCell(x, HSSFCell.CELL_TYPE_NUMERIC);
                    cell4.setCellValue(dayCount);
                    rowCountArray[i][x - 3] = dayCount;
                }

                //添加合计信息
                Cell cell5 = row.createCell(count02, HSSFCell.CELL_TYPE_NUMERIC);
                cell5.setCellValue(companyDanCount.getDanCount());
                rowCountArray[i][count02 - 3] = companyDanCount.getDanCount();*/

            }

            //创建数组存储每一列的合计
            int[] countArray = new int[count02 - 2];

            //遍历二维数组，填充合计行的数据
            for (int a = 0; a < rowCountArray.length; a++) {
                for (int b = 0; b < rowCountArray[a].length; b++) {
                    countArray[b] += rowCountArray[a][b];
                }
            }
            //创建合计行的单元格；
            for (int x = 0; x < countArray.length; x++) {
                Cell cell4 = rowm2.createCell(x + 3, HSSFCell.CELL_TYPE_NUMERIC);
                cell4.setCellValue(countArray[x]);
            }

            //导出Excel文件
            if (sxssfWorkbook != null) {
                try {
                    // excel 表文件名
                    String fileName = title + ".csv";
                    fileName = "attachment;filename=" + new String(fileName.getBytes("gbk"), "iso8859-1");
                    response.setContentType("application/vnd.ms-excel;charset=utf-8");
                    response.setHeader("Content-Disposition", fileName);
                    OutputStream out = response.getOutputStream();
                    sxssfWorkbook.write(out);
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }




    public CellStyle getColumnTopStyle(SXSSFWorkbook workbook) {

        // 设置字体
        Font font = workbook.createFont();
        //设置字体大小
        font.setFontHeightInPoints((short) 11);
        //字体加粗
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        //设置字体名字
        font.setFontName("Courier New");
        //设置样式;
        CellStyle style = workbook.createCellStyle();
        //设置底边框;
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        //设置底边框颜色;
        style.setBottomBorderColor(HSSFColor.BLACK.index);
        //设置左边框;
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        //设置左边框颜色;
        style.setLeftBorderColor(HSSFColor.BLACK.index);
        //设置右边框;
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        //设置右边框颜色;
        style.setRightBorderColor(HSSFColor.BLACK.index);
        //设置顶边框;
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        //设置顶边框颜色;
        style.setTopBorderColor(HSSFColor.BLACK.index);
        //在样式用应用设置的字体;
        style.setFont(font);
        //设置自动换行;
        style.setWrapText(false);
        //设置水平对齐的样式为居中对齐;
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //设置垂直对齐的样式为居中对齐;
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

        return style;

    }

    public CellStyle getStyle(SXSSFWorkbook workbook) {
        // 设置字体
        Font font = workbook.createFont();
        //设置字体大小
        //font.setFontHeightInPoints((short)10);
        //字体加粗
        //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        //设置字体名字
        font.setFontName("Courier New");
        //设置样式;
        CellStyle style = workbook.createCellStyle();
        //设置底边框;
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        //设置底边框颜色;
        style.setBottomBorderColor(HSSFColor.BLACK.index);
        //设置左边框;
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        //设置左边框颜色;
        style.setLeftBorderColor(HSSFColor.BLACK.index);
        //设置右边框;
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        //设置右边框颜色;
        style.setRightBorderColor(HSSFColor.BLACK.index);
        //设置顶边框;
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        //设置顶边框颜色;
        style.setTopBorderColor(HSSFColor.BLACK.index);
        //在样式用应用设置的字体;
        style.setFont(font);
        //设置自动换行;
        style.setWrapText(false);
        //设置水平对齐的样式为居中对齐;
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //设置垂直对齐的样式为居中对齐;
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

        return style;
    }
}